package com.ruoyi.sale.service;

import com.ruoyi.product.domain.Product;
import com.ruoyi.sale.domain.*;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * @author WangChangShuo
 * @date 2022年05月26日 9:44
 */

public interface ISaleGoodsService {
    /**
     * 查新销货单数据集合
     *
     * @param saleGoodsOrder 查询条件
     */
    List<SaleGoodsOrder> selectSaleGoodsList(SaleGoodsOrder saleGoodsOrder);

    /**
     * 用与查询销货单子表状态未完成的
     */
    List<SaleGoodsOrder> selectSaleGoodsListInvoice(SaleGoodsOrder saleGoodsOrder);

    /**
     * 查询销货单子表数据
     *
     * @param hashMap 查询条件
     */
    SaleGoodsModel selectSaleGoodsModel(HashMap<Object, Object> hashMap);

    /**
     * 插入销货单集合数据
     *
     * @param saleGoodsOrder 插入数据
     */
    int insertSaleGoodsOrder(SaleGoodsOrder saleGoodsOrder);

    int addAfter(SaleGoodAfter saleGoodAfter);

    /**
     * 插入销货单子表数据
     *
     * @param saleGoodsModel 插入子表数据
     */
    int insertSaleGoodsModels(SaleGoodsModel saleGoodsModel);

    /**
     * 查询销货单数据集合
     *
     * @param hashMap 查询条件
     */
    SaleGoodsOrder selectSaleGoodsById(HashMap<String, Object> hashMap);

    /**
     * 查询销货单数据
     *
     * @param companyId 公司主键
     */
    List<SaleGoodsOrder> selectSaleGoodsCustObj(Long companyId);

    /**
     * 根据销货单状态查询
     *
     * @param saleGoodsOrder 查询条件
     */
    List<SaleGoodsOrder> selectSaleGoodsByStatus(SaleGoodsOrder saleGoodsOrder);

    /**
     * 查询所有的销货单信息
     *
     * @param hashMap 查询条件
     */
    SaleGoodsOrder selectSaleGoodsByIds(HashMap<String, Object> hashMap);

    /**
     * 出库审核 通过后 修改库存
     *
     * @param
     */
    void outboundAudit(SaleGoodsOrder saleGoodsOrder);

    /**
     * 查询销货单的销货单子表数据
     *
     * @param saleGoodsId 销货单主键
     */
    List<SaleGoodsModel> selectSaleGoodsModelById(Long saleGoodsId);

    /**
     * 查询销货单子表数据集
     *
     * @param saleGoodsModel 销货单子表查询条件
     */
    SaleGoodsModel selectSaleGoodsModelByIds(SaleGoodsModel saleGoodsModel);

    /**
     * 查询销货单子表数据集合
     *
     * @param hashMap 查询条件
     */
    List<SaleGoodsModel> selectSaleGoodsModelByMap(HashMap hashMap);

    /**
     * 查询销货单子表数据
     *
     * @param saleGoodsModelId 销货单子表主键
     */
    SaleGoodsModel selectSaleGoodsModelByModelId(Long saleGoodsModelId);

    /**
     * 查询销售订单剩余
     *
     * @param saleGoodsId 销货单主键
     */
    List<SaleGoodsOrder>    selectSaleGoodsResidue(Long saleGoodsId);

    /**
     * 查询采购入库的数据集合
     *
     * @param saleGoodsId 销货单主键
     */
    List<Product> selectProcurementByIds(Long saleGoodsId);

    /**
     * 查询销货单数据集合
     *
     * @param saleGoodsOrder 查询条件
     */
    List<SaleGoodsOrder> selectSaleGoodsLists(SaleGoodsOrder saleGoodsOrder);

    /**
     * 修改销货单状态
     *
     * @param hashMap 需要修改的数据
     */
    int updateSaleGoodsStatus(HashMap hashMap);

    int updateBackNum(HashMap hashMap);

    /**
     * 根据库存条件查询销货单子表数据集合
     *
     * @param hashMap 查询条件
     */
    List<SaleGoodsModel> selectSaleGoodsModelWarehousingOrderIsSuppByMap(HashMap hashMap);

    /**
     * 查询订单审核 中销售退货信息
     *
     * @param saleGoodsId 查询条件
     */
    List<Product> selectSaleGoodsModelByNo(Long saleGoodsId);

    /**
     * PDA 查询订单审核 中销售退货信息
     *
     * @param saleGoodsOrder 查询条件
     */
    List<SaleGoodsOrder> selectSaleGoodsListes(SaleGoodsOrder saleGoodsOrder);

    /**
     * 查询销售商品展示清单
     *
     * @param saleGoodsOrder 查询条件
     */
    List<SaleGoodsOrder> selectSaleGoodsShowList(SaleGoodsOrder saleGoodsOrder);

    /**
     * 通过状态选择销售货物客户对象
     *
     * @param companyId 公司逐渐
     * @return 查询条件
     */
    List<SaleGoodsOrder> selectSaleGoodsCustObjByStatus(Long companyId);

    /**
     * 查询销货单数量及批次
     *
     * @param map1 查询条件
     */
    SaleGoodsModel selectSaleModelByMap(Map<String, Object> map1);

    /**
     * 查询销货单
     *
     * @param map 查询条件
     */
    SaleGoodsOrder selectSaleGoodsByMap(Map<String, Object> map);

    /**
     * 查询销货单子表数据
     *
     * @param saleGoodIdList 查询条件
     */
    List<SaleGoodsModel> selectSaleGoodsModelByList(List<Long> saleGoodIdList,Long deptId);

    /**
     * 插入销货单 选择销售订单的数量
     *
     * @param saleNumRecords 需要插入的数据
     */
    int insertSaleNumRecordList(List<SaleNumRecord> saleNumRecords);



    public int auditSale(SaleGoodsOrder saleGoodsOrder);



    /**
     * 审核驳回时修改销售订单中的剩余数量和执行数量
     *
     * @param orderId 销售订单主键
     */
    Boolean auditSalesOrderEdit(Long orderId);

    /**
     * 修改保存销货单信息
     *
     * @param saleGoodsOrder 销货单数据
     * @param saleorderOrder 销售订单数据
     */
    int editSave(SaleGoodsOrder saleGoodsOrder, SaleorderOrder saleorderOrder);

    /**
     * 按列表选择销售商品型号
     *
     * @param maps 查询条件
     */
    List<SaleGoodsModel> selectSaleGoodsModelByListes(List<Map> maps);

    /**
     * 查询PDA选择销售商品清单
     *
     * @param saleGoodsOrder 查询条件
     */
    List<SaleGoodsOrder> selectSaleGoodsListByPDA(SaleGoodsOrder saleGoodsOrder);

    /**
     * 确认开票信息
     *
     * @param saleGoodsOrder 开票信息
     */
    int updateSaleorderOrderIsPay(SaleGoodsOrder saleGoodsOrder);
    /**
     * 查看销货订单的数据
     *
     * @param hashMap 查询条件
     * @return 结果
     */
    SaleGoodsOrder selectSaleGoodsByIdIsLook(HashMap hashMap);

    List<SaleGoodAfter> selectAfterList(Long deptId);

    int selectSaleGoodsBySaleorderNum(String saleorderNum);

    // 获取上一条记录
    Long querypreviousId(Long saleGoodsId);
    // 获取下一条记录
    Long queryNextId(Long saleGoodsId);

    /**
     * 发货
     *
     * @param saleGoodsId 销货单ID
     * @return 结果
     */
    Map<String, Object> shipments(String saleGoodsId);

    /**
     * 打印快递单
     * @param saleGoodsId 销货单ID
     * @return 结果
     */
    Map<String, Object> printExpressOrder(Long saleGoodsId);

    List<SaleGoodsExcel> queryExcel(SaleGoodsExcel saleGoodsExcel);

    List<Map<String, Object>> pendingReview(Long deptID);

    /**
     * 根据部门ID和状态查询记录数
     * @param deptID
     * @return
     */
    Integer selectCountByDeptIDAndStatus(Long deptID);
}
